package icu.feigroup.types.design.framwork.tree;

import lombok.Getter;
import lombok.Setter;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

/**
 * projectName:icu.feigroup.types.design.framwork.tree
 *
 * @author 飞
 * @since 2025/2/19 11:05
 * description: 策略路由抽象类
 */
public abstract class AbstractMultiThreadStrategyRouter<T, D, R> implements StrategyHandler<T, D, R>,StrategyMapper<T, D, R> {
    @Getter
    @Setter
    protected StrategyHandler<T, D, R> defaultStrategyHandler =StrategyHandler.DEFAULT;
    public R router(T requestParameter, D dynamicContext) throws Exception{
        StrategyHandler<T, D, R> strategyHandler = get(requestParameter, dynamicContext);
        if (strategyHandler!=null){
            return strategyHandler.apply(requestParameter,dynamicContext);
        }
        return defaultStrategyHandler.apply(requestParameter,dynamicContext);
    }

    @Override
    public R apply(T requestParameter, D dynamicContext) throws Exception {
        //异步加载数据
        multiThread(requestParameter,dynamicContext);

        return doApply(requestParameter,dynamicContext);
    }

    /**
     * 异步加载数据
     */
    protected abstract void multiThread(T requestParameter, D dynamicContext) throws ExecutionException, InterruptedException, TimeoutException;

    /**
     * 业务流程受理
     */
    protected abstract R doApply(T requestParameter, D dynamicContext) throws Exception;
}
